<!-- directive:title ES6学习笔记 -->
<!-- directive:breadcrumb ES6学习笔记 -->
<div class='panel-body'>
    <article class="docs-content">
        <div class="row">
            <div class="col-sm-6">
                <h3>发音 迷 思应~ missing</h3>
                <p>谈到Mixin就不得不谈到多重继承，因为Mixin的出现就是为了解决多重继承的问题，</p>
                <p>那么多重继承有什么问题呢？在《松本行弘的程序世界》一书中，作者列举了以下三点：</p>
                <p>结构复杂化：如果是单一继承，一个类的父类是什么，父类的父类是什么，都很明确，</p>
                <p>因为只有单一的继承关系，然而如果是多重继承的话，一个类有多个父类，</p>
                <p>这些父类又有自己的父类，那么类之间的关系就很复杂了。</p>
                <p>优先顺序模糊：</p>
                <p>假如我有A，C类同时继承了基类，B类继承了A类，</p>
                <p>然后D类又同时继承了B和C类，</p>
                <p>所以D类继承父类的方法的顺序应该是D、B、A、C还是D、B、C、A，</p>
                <p>或者是其他的顺序，很不明确。</p>
                <p></p>
                <p>功能冲突：因为多重继承有多个父类，所以当不同的父类中有相同的方法是就会产生冲突。</p>
                <p>如果B类和C类同时又有相同的方法时，D继承的是哪个方法就不明确了，</p>
                <p>因为存在两种可能性。当然你可以说有些语言解决了这个问题，</p>
                <p>但是并不是所有语言都想要去纠结这个问题。所以为能够利用多继承的优点又解决多继承的问题，</p>
                <p>提出了规格继承和实现继承这两样东西。简单来讲，规格继承指的是一堆方法名的集合，</p>
                <p>而实现继承除了方法名还允许有方法的实现。</p>
                <p>Java 选择了规格继承，在 Java 中叫 interface（不过Java8中已经有默认方法了），</p>
                <p>而 Ruby 选择了实现继承，也可以叫Mixin，在 Ruby 中叫 module。</p>
                <p>从某种程度上来说，继承强调 I am，Mixin 强调 I can。</p>
                <p>当你 implement 了这个接口或者 include 这个 module 的时候，然后就你行你上。</p>
                <p>所以这又可以扯到 duck typing 去了，不细说。</p>
                <hr />
                <p>mixin不是多继承，mixin是duck type的糖，让你可以不用去把一坨坨Interface继承一遍然后才能彼此调用接口。</p>
                <hr />
                <p> 与plugin可被安装到兼容的宿主程序的概念类似，mixin是一个class/object，它的属性/方法可动态复制到其他适配的class/object。</p>
            </div>
            <div class="col-sm-6">
                <script type="text/xian" ui-bs>
                    var Car = function(opts){
                        this.speed = opts.speed || 0
                    } 
                    var Bike = function(opts){
                        this.speed = opts.speed || 0;
                        this.ride = function(){
                            console.log('现在骑行速度是' + this.speed)
                        }
                    }
                    var Feature = function(){
                    }
                    Feature.prototype = {
                        drive : function(){
                            console.log('现在开车速度是' + this.speed)
                        },
                         accelerate : function(val){
                                this.speed = this.speed + val;
                         }
                    }
                    //混入模式的实现
                    function Mixin(recClass,giveClass){
                        if(arguments.length > 2){
                            for(var i = 2,lenth = arguments.length; i < lenth ; ++ i){
                                var methodName = arguments[i];
                                recClass.prototype[methodName] = giveClass.prototype[methodName];
                            }
                        }else{
                            for(var methodName in giveClass.prototype){
                                if(!recClass.prototype[methodName]){
                                    recClass.prototype[methodName] = giveClass.prototype[methodName];
                                }
                            }
                        }
                    }
                    Mixin(Car,Feature);
                    var BMW = new Car({
                    })
                    
                    BMW.accelerate(20)
                    BMW.drive()
                    Mixin(Bike,Feature,'accelerate');
                    
                    var ofo = new Bike({})
                    ofo.accelerate(8);
                    ofo.ride();
                </script>
            </div>
        </div>
    </article>
</div>
